import { AppDataSource } from '../config/database';
import { User } from '../entities/User';
import { Repository, In } from 'typeorm';
import { createWxSDK } from '../sdk/weixin';
import { WxConfig } from '../sdk/weixin/types';
import { WxTemplateMsgSDK } from '../sdk/weixin/WxTemplateMsgSDK';
import { mpWeixinConfig } from '../config';

// 使用内置的日期格式化函数
const formatDate = (date: Date): string => {
  return date.toLocaleString('zh-CN', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit'
  }).replace(/\//g, '年').replace(/\//g, '月').replace(',', '日');
};

export class NotificationService {
  private userRepository: Repository<User>;
  private templateMsgSDK: WxTemplateMsgSDK;
  private config: WxConfig;
  
  constructor(wxConfig: WxConfig) {
    this.userRepository = AppDataSource.getRepository(User);
    this.templateMsgSDK = createWxSDK(wxConfig).templateMsg;
    this.config = wxConfig;
    
    // 打印 appid 配置信息
    console.log('NotificationService 初始化，appid:', wxConfig.appId);
    if (!wxConfig.appId || wxConfig.appId === '') {
      console.error('警告：appId 未配置或为空字符串！');
    }
  }
  
  /**
   * 发送录取通知
   * @param userId 用户ID
   */
  async sendAdmissionNotification(userId: string): Promise<boolean> {
    try {
      // 获取用户信息
      const user = await this.userRepository.findOne({ where: { id: userId } });
      if (!user || !user.wxOpenid || !user.subscriptionStatus) {
        console.error('用户不存在、未绑定微信或未订阅消息');
        return false;
      }
      
      // 格式化录取时间
      const admissionTime = user.admissionTime 
        ? formatDate(user.admissionTime)
        : formatDate(new Date());
      
      // 发送录取通知模板消息
      return await this.templateMsgSDK.sendNotification(
        user.wxOpenid,
        'admission',
        {
          name1: user.name,
          thing2: user.admittedMajor || '未指定专业',
          time3: admissionTime,
          thing4: `恭喜您被我校录取，请在规定时间内完成相关手续。`
        }
      );
    } catch (error: any) {
      console.error('发送录取通知失败:', error.message);
      return false;
    }
  }
  
  /**
   * 发送录取结果模板消息（使用指定模板）
   * @param userId 用户ID
   * @param admittedMajor 录取专业
   * @returns 是否发送成功
   */
  async sendAdmissionTemplateMessage(userId: string, admittedMajor: string): Promise<boolean> {
    try {
      // 获取用户信息
      const user = await this.userRepository.findOne({ where: { id: userId } });
      if (!user || !user.wxOpenid) {
        console.error('用户不存在或未绑定微信');
        return false;
      }
      
      // 打印当前使用的 appid
      console.log('发送录取模板消息，使用的 appid:', this.config.appId);
      
      // 处理专业名称，确保符合微信的要求
      // short_thing3 类型严格限制为5个字符
      const formattedMajor = admittedMajor ? 
        admittedMajor.substring(0, 5).trim() : 
        '未指定';
      
      console.log('格式化后的专业名称:', formattedMajor);
      
      // 处理用户姓名，确保不超过20个字符
      const formattedName = user.name ? 
        user.name.substring(0, 20).trim() : 
        '用户';
      
      // 直接使用 send 方法发送，避免 sendNotification 方法中的额外处理
      return await this.templateMsgSDK.send({
        openid: user.wxOpenid,
        templateId: 'qg7QyEcj9LC3aRuypnDE9q3010MepT1SROjjx00sgX8',
        data: {
          thing1: { value: formattedName }, // 姓名，限制20个字符
          phrase2: { value: '已录取' }, // 审核结果
          short_thing3: { value: formattedMajor } // 审核机制（这里使用录取专业）
        },
        page: 'pages/enrollment/admission' // 跳转到录取结果页面
      });
    } catch (error: any) {
      console.error('发送录取模板消息失败:', error.message);
      return false;
    }
  }
  
  /**
   * 发送缴费提醒
   * @param userId 用户ID
   * @param amount 缴费金额
   * @param dueDate 截止日期
   */
  async sendPaymentReminder(userId: string, amount: string, dueDate: string): Promise<boolean> {
    try {
      // 获取用户信息
      const user = await this.userRepository.findOne({ where: { id: userId } });
      if (!user || !user.wxOpenid || !user.subscriptionStatus) {
        console.error('用户不存在、未绑定微信或未订阅消息');
        return false;
      }
      
      // 发送缴费提醒模板消息
      return await this.templateMsgSDK.sendNotification(
        user.wxOpenid,
        'payment',
        {
          name1: user.name,
          amount2: amount,
          date3: dueDate,
          thing4: '请在截止日期前完成缴费，逾期将影响入学资格。'
        }
      );
    } catch (error: any) {
      console.error('发送缴费提醒失败:', error.message);
      return false;
    }
  }
  
  /**
   * 批量发送提醒通知
   * @param userIds 用户ID数组
   * @param message 提醒消息
   */
  async sendBatchReminders(userIds: string[], message: string): Promise<{ success: number; failed: number }> {
    let success = 0;
    let failed = 0;
    
    // 查询所有用户
    const users = await this.userRepository.find({ 
      where: { id: In(userIds) } 
    });
    
    // 批量发送通知
    for (const user of users) {
      if (!user.wxOpenid || !user.subscriptionStatus) {
        console.log(`用户 ${user.id} 未绑定微信或未订阅消息，跳过发送`);
        failed++;
        continue;
      }
      
      const result = await this.templateMsgSDK.sendNotification(
        user.wxOpenid,
        'reminder',
        {
          name1: user.name,
          thing2: message.substring(0, 20), // 微信限制20个字符
          date3: formatDate(new Date()).split(' ')[0], // 只保留日期部分
          thing4: '请及时查看系统通知。'
        }
      );
      
      if (result) {
        success++;
      } else {
        failed++;
      }
    }
    
    return { success, failed };
  }
}

// 打印配置信息
console.log('微信小程序配置 appId:', mpWeixinConfig.appId);
console.log('微信小程序配置 appSecret:', mpWeixinConfig.appSecret ? '已设置' : '未设置');

if (!mpWeixinConfig.appId || mpWeixinConfig.appId === '') {
  console.error('错误：微信小程序 appId 未配置或为空！');
}

if (!mpWeixinConfig.appSecret || mpWeixinConfig.appSecret === '') {
  console.error('错误：微信小程序 appSecret 未配置或为空！');
}

// 创建通知服务实例
export const notificationService = new NotificationService(mpWeixinConfig); 